package com.example.test.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class FileAspect {

    private Logger logger= LoggerFactory.getLogger(FileAspect.class);
    //AOP切面类来拦截这个注解
    @Pointcut("@annotation(com.example.test.annotation.FileTypeAnnotation)")
    public void deal(){
    }

//    //在目标方法执行过程中做一些处理(同时实现前置和后置通知)
//    @Around("deal()")
//    public String doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//        // 获取目标方法上的注解
//        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//        Method method = methodSignature.getMethod();
//        System.out.println(method);
//        FileTypeAnnotation fileTypeAnnotation = method.getAnnotation(FileTypeAnnotation.class);
//        if(fileTypeAnnotation==null){
//            //判断是否有fileTypeAnnotation注解，如果没有加fileTypeAnnotation注解：不进行逻辑处理，直接放行
//            return (String) joinPoint.proceed();
//        }
//        // 获取方法注解中定义的字段值
//        String[] type = fileTypeAnnotation.type();
//        System.out.println(Arrays.toString(type));
//
//        Object[] objects = joinPoint.getArgs();
////        for (Object param:objects) {
////            System.out.println(param);
////        }
//        MultipartFile file = (MultipartFile) objects[0];
//        String fileName = file.getOriginalFilename();
//        System.out.println("上传的文件名："+fileName);
//        System.out.println("上传的文件类型："+file.getContentType());
//        String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
//        System.out.println("上传的文件后缀："+fileSuffix);
//        if(Arrays.asList(type).contains(fileSuffix)==false){
//            throw new DefinitionException("文件类型不支持");
//        }
//        //执行目标方法
//        return (String) joinPoint.proceed();
//    }


    /**
     * 前置通知：在被代理方法之前调用
     */
    @Before("deal()")
    public void doBefore(JoinPoint joinPoint) {
        logger.warn("调用方法之前：");
    }

    /**
     * 后置通知：在被代理方法之后调用
     */
    @After("deal()")
    public void doAfter(JoinPoint joinPoint) {
        logger.warn("调用方法之后：");
    }

    /**
     * 返回通知：被代理方法正常返回之后调用
     */
    @AfterReturning("deal()")
    public void doReturning(JoinPoint joinPoint) {
        logger.warn("方法正常返回之后：");
    }

    /**
     * 异常通知：被代理方法抛出异常时调用
     */
    @AfterThrowing(pointcut="deal()",throwing="e")
    public void doThrowing(JoinPoint joinPoint,Throwable e) {
        logger.error("方法抛出异常！"+e.getMessage());
    }





}
